#include <iostream>
#include <memory>
using namespace std;

void test1()
{
    // 创建和初始化
    auto sp1 = make_shared<int>(100);
    // 相当于
    shared_ptr<int> sp2(new int(100));
    shared_ptr<int> sp3 = shared_ptr<int>(new int(100));
    auto sp4 = shared_ptr<int>(new int(100));

    // reset    重新指向新对象，不带参数则置空
    // 调用reset之后，原来对象的智能指针的引用计数会-1，-1之后如果是0的话就会销毁这个智能指针
    auto sp5 = make_shared<int>(100);
    sp5.reset(new int(123));

    cout << sp5.use_count() << endl; // 返回引用计数
}

// 注意点
void test2()
{
    int *pa = new int(1);
    shared_ptr<int> spa1(pa);
    shared_ptr<int> spa2(pa); // 会报错
}

class A
{
public:
    shared_ptr<B> a;
};

class B
{
public:
    shared_ptr<A> a;
};

int main()
{
    // test2();
    A *a1;
    B *b1;
    a1->a = b1;
    b1->b = a1;
    return 0;
}